#ifndef __MLC1112_H
#define __MLC1112_H

#include "i2c_master.h"
#include "stdint.h"

#define CLKIN 2.4 //MC11/12 内部参考时钟,单位Mhz
#define C0 20.0    //C0
#define C1 220.0
#define C2 220.0
#define C2p 115.0
#define C3 220.0
#define C3p 155.0

#define C4 20.0    //C1
#define C5 220.0
#define C6 220.0
#define C6p 115.0
#define C7 220.0
#define C7p 155.0

#define print_en  0
#define PR(format, ...)    if(print_en)printf(format, ##__VA_ARGS__);

extern unsigned char I2C_ADDR[4]; /* Addr 0x41 0x42 0x43*/
typedef enum 
{
//FIN_DIV_CH0 通道0震荡信号分频系数

  CH0_FIN_DIV_0        	= 0x00,   //不分频
  CH0_FIN_DIV_2        	= 0x10,   //2 分频
  CH0_FIN_DIV_4        	= 0x20,   //4 分频
  CH0_FIN_DIV_8        	= 0x30,   //8 分频
  CH0_FIN_DIV_16        = 0x40,   //16 分频
  CH0_FIN_DIV_32        = 0x50,   //32 分频
  CH0_FIN_DIV_64        = 0x60,   //64 分频
  CH0_FIN_DIV_128       = 0x70,   //128 分频	
  CH0_FIN_DIV_256       = 0x80,   //256 分频
	
//FIN_DIV_CH1 通道1震荡信号分频系数
  CH1_FIN_DIV_0        	= 0x00,   //不分频
  CH1_FIN_DIV_2        	= 0x10,   //2 分频
  CH1_FIN_DIV_4        	= 0x20,   //4 分频
  CH1_FIN_DIV_8        	= 0x30,   //8 分频
  CH1_FIN_DIV_16        = 0x40,   //16 分频
  CH1_FIN_DIV_32        = 0x50,   //32 分频
  CH1_FIN_DIV_64        = 0x60,   //64 分频
  CH1_FIN_DIV_128       = 0x70,   //128 分频	
  CH1_FIN_DIV_256       = 0x80,   //256 分频	
	

} I2C_CMD;

//CFG寄存器说明：时钟选择/电容比较输出结果
#define   REF_SEL_In_CLK          0x00<<7  //选择内部时钟
#define   REF_SEL_Ex_CLK          0x01<<7  //选择外部时钟

#define   INTB_EN_DIS     		    0x00<<6  //INTB 不输出标志位
#define   INTB_EN_EN     	        0x01<<6  //INTB 输出报警标志位或者转换完成标志位
#define   INTB_MODE_ALERT     	  0x00<<5  //INTB 输出报警标志位
#define   INTB_MODE_TRANS     	  0x01<<5  //IINTB 输出转换完成标志位

#define   CR_60S            	    0x00  //连续转换模式的时间间隔 60s 转换一次
#define   CR_30S            	    0x04  //连续转换模式的时间间隔 30s 转换一次
#define   CR_10S            	    0x08  //连续转换模式的时间间隔 10s 转换一次
#define   CR_5S            	      0x0c  //连续转换模式的时间间隔 5s 转换一次
#define   CR_2S            	      0x10  //连续转换模式的时间间隔 2s 转换一次
#define   CR_1S            	      0x14  //连续转换模式的时间间隔 1s 转换一次
#define   CR_05S            	    0x18  //连续转换模式的时间间隔 0.5s 转换一次
#define   CR_025S            	    0x1c  //连续转换模式的时间间隔 0.25s 转换一次

#define Config_Mode_Pos                  0X3
//设置通道转换模式
typedef enum 
{
  OS_SD_Continuous_Trans  =   0x00 , //设置通道转换模式 连续转换
  OS_SD_Stop_Trans        =   0x01 , //设置通道转换模式 停止转换
  OS_SD_Single_Trans      =   0x03 , //设置通道转换模式 单次转化
}Measure_mode;


#define   CH1_DISABLE             0x00<<7  //通道 1 关闭
#define   CH1_ENABLE              0x01<<7  //通道 1 开启
#define   CH0_DISABLE             0x00<<6  //通道 0 关闭
#define   CH0_ENABLE              0x01<<6  //通道 0 开启

//DRIVE_I_CH0 说明,地址 0x23 ,设置通道 0 的驱动电流
typedef enum 
{
   DRIVE_I_CH0_05mA       =      0x00 ,  //0.5mA
   DRIVE_I_CH0_10mA       =      0x10 ,  //1.0mA
   DRIVE_I_CH0_15mA       =      0x20 ,  //1.5mA
   DRIVE_I_CH0_20mA       =      0x30 ,  //2.0mA
   DRIVE_I_CH0_25mA       =      0x40 ,  //2.5mA
   DRIVE_I_CH0_30mA       =      0x50 ,  //3.0mA
   DRIVE_I_CH0_35mA       =      0x60 ,  //3.5mA
   DRIVE_I_CH0_40mA       =      0x70 ,  //4.0mA
   DRIVE_I_CH0_45mA       =      0x80 ,  //4.5mA
   DRIVE_I_CH0_50mA       =      0x90 ,  //5.0mA
   DRIVE_I_CH0_55mA       =      0xA0 ,  //5.5mA
   DRIVE_I_CH0_60mA       =      0xB0 ,  //6.0mA
   DRIVE_I_CH0_65mA       =      0xC0 ,  //6.5mA
   DRIVE_I_CH0_70mA       =      0xD0 ,  //7.0mA
   DRIVE_I_CH0_75mA       =      0xE0 ,  //7.5mA
   DRIVE_I_CH0_80mA       =      0xF0 ,  //8.0mA
}Drive_I_Type;


typedef enum 
{
  DATA_CH0_MSB					      = 0x00,   // 通道 0 转换数据
  DATA_CH0_LSB              	= 0x01,   // 通道 0 转换数据
	
  DATA_CH1_MSB              	= 0x02,   // 通道 1 转换数据
  DATA_CH1_LSB              	= 0x03,   // 通道 1 转换数据
	
  RCNT_CH0_MSB              	= 0x08,  //默认值0x40：通道 0 计数时间
  RCNT_CH0_LSB	              = 0x09,  //默认值0x00：通道 0 计数时间
	
  RCNT_CH1_MSB                = 0x0A,  //默认值0x40：通道 1 计数时间
  RCNT_CH1_LSB          	    = 0x0B,  //默认值0x00：通道 1 计数时间
	
  SCNT_CH0               	    = 0x0E,	  //默认值0x20:通道 0 建立时间
  SCNT_CH1               	    = 0x0F,	  //默认值0x20:通道 1 建立时间
	
  FIN_DIV_CH0                	= 0x11,	  //默认值0x70:通道 0 振荡信号分频
  FREF_DIV_CH0              	= 0x12,   //默认值0x00:通道 0 参考时钟分频
  FIN_DIV_CH1               	= 0x13,	  //默认值0x70:通道 1 振荡信号分频
  FREF_DIV_CH1	              = 0x14,   //默认值0x00:通道 1 参考时钟分频
  STATUS                   	  = 0x17,   //默认值0x00：状态位，只读

  TH_MSB             	        = 0x19,	  //默认值0x20:单通道报警触发门限
  TH_LSB                    	= 0x1A,	  //默认值0x20:单通道报警触发门限
  TL_MSB             	        = 0x1B,   //默认值0x10:单通道报警解除门限
  TL_LSB                    	= 0x1C,   //默认值0x00:单通道报警解除门限
  CFG             	          = 0x1F,   //默认值0x54:通道转换与 INTB 功能配置
  CHX_EN                      = 0x20,   //默认值0xC0:通道选择配置
  MC_RESET                    = 0x22, 	//复位功能,只写
  DRIVE_I_CH0 					      = 0x23,   //默认值0x50：通道 0 驱动电流和低电压配置
  DRIVE_I_CH1					        = 0x24,   //默认值0x50：通道 1 驱动电流
  GLITCH_FILTER_EN				    = 0x33,   //默认值0x01：抗尖峰滤波器
  CHIP_ID_MSB					        = 0x7E,    //默认值0x01：芯片 ID，只读
  CHIP_ID_LSB      			      = 0x7F,    //默认值0x20：芯片 ID，只读
  
} REG;


I2C_Trans_Type MC1112_I2C_Transmit(uint8_t DeviceAddr, REG reg, uint8_t Data);
I2C_Trans_Type MC1112_I2C_Receive(uint8_t DeviceAddr, REG reg,uint8_t *pData);
int MLC12_SetFreDiv(uint16_t fin_div,uint8_t fref_div);
int MLC12_SetDrive_I(Drive_I_Type drive_i);
int MLC12_SetChannel(uint8_t ch);
int MLC12_SetAlert(uint16_t TH , uint16_t TL);
int MLC12_Reset(void);
int MLC12_Filter_EN(uint8_t en);
int MLC12_ConfigMode(Measure_mode mode);
int MLC12_Init(int *wait_time);
int MLC12_Measure(float *F0, float *F1 ,int wait_time);
int MLC12_Measure(float *F0, float *F1 ,float *L0, float *L1 ,int wait_time);
uint8_t MC_Log2(uint32_t DATA);
int MC_Pow2(uint8_t N);
#endif



